class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        /*
        int len=strs.size();
        //dp[i][j][k] 在前i个字符串中所需0小于等于j,1小于等于k个的个数。
        vector<vector<vector<int>>> dp(len+1,vector<vector<int>>(m+1,vector<int>(n+1,0)));
        pair<int,int> tmp(0,0);

        for(int i=1;i<=len;i++){
            for(int j=0;j<=m;j++){
                for(int k=0;k<=n;k++){
                    tmp=stat(strs[i-1]);
                    if(tmp.first<=j&&tmp.second<=k){
                        dp[i][j][k]=max(dp[i-1][j-tmp.first][k-tmp.second]+1,dp[i-1][j][k]);
                    }else{
                        dp[i][j][k]=dp[i-1][j][k];
                    }
                    //cout<<"i:"<<i<<",j:"<<j<<",k:"<<k<<",dp:"<<dp[i][j][k]<<endl;
                }
            }
        }
        return dp[len][m][n];
        */
       
        pair<int,int> zero_one;
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        for(int i=0;i<strs.size();i++){
            zero_one=stat(strs[i]);
            for(int j=m;j>=zero_one.first;j--){
                for(int k=n;k>=zero_one.second;k--){
                    dp[j][k]=max(dp[j][k],dp[j-zero_one.first][k-zero_one.second]+1);
                }
            }
        }
        return dp[m][n];
    }

private:

    pair<int,int> stat(const string & str){
        pair<int,int> tmp(0,0);
        for(int i=0;i<str.size();i++){
            if(str[i]=='0'){
                tmp.first++;
            }else{
                tmp.second++;
            }
        }
        return tmp;
    }
};